<?php

namespace app\logic;

vendor('aliyun-oss.autoload');

use OSS\OssClient;
use OSS\Core\OssException;
use think\Request;

class UploadImg
{
    private $str_model_name;

    private $str_id_name;

    private $arr_type = [];

    public function __construct($str_model_name)
    {
        $this->str_model_name = $str_model_name;
        switch ($str_model_name) {
            case 'admin':
                $this->str_id_name = 'admin_id';
                // headPortrait-头像、idCard-身份证
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack', 'platform_logo','workCard','businessLicense','openLicence','letterOfAuthority','courierCompanyLOGO'];
                break;
            case 'user': // 用户端
                $this->str_id_name = 'user_id';
                // headPortrait-头像、idCard-身份证
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack'];
                break;
            case 'courier': // 快递端
                $this->str_id_name = 'courier_id';
                // headPortrait-头像、idCard-身份证/workCard :工牌；signForUser：用户签收
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack', 'workCard', 'signForUser'];
                break;
            case 'driver': // 司机端
                $this->str_id_name = 'driver_id';
                // headPortrait-头像、idCard-身份证
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack'];
                break;
            case 'stationapp': // 站点手机端
                $this->str_id_name = 'station_member_id';
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack'];
                break;
            case 'stationpc': // 站点PC端
                $this->str_id_name = 'station_id';
                $this->arr_type = ['headPortrait', 'idCard', 'idCardFront', 'idCardBack'];
                break;
            default:
                return false;
        }
    }

    /**
     * 上传图片
     */
    public function uploadImg($str_type)
    {
        _toCompare(in_array($str_type, $this->arr_type), '===', false, 10818); // 图片分类不正确

        _toCompare(!isset($_FILES['file_data']['name']), '===', true, 13018);
        _toCompare(!isset($_FILES['file_data']['type']), '===', true, 13018);
        _toCompare(!isset($_FILES['file_data']['tmp_name']), '===', true, 13018);
        _toCompare(!isset($_FILES['file_data']['error']), '===', true, 13018);

        $arr_file = $_FILES['file_data'];

        // 文件名称
        $str_name = $arr_file['name'];
        // 得到文件类型，并且都转化成小写
        $str_img_type = strtolower(substr($str_name, strrpos($str_name, '.') + 1));
        // 定义允许上传的类型
        $arr_allow_type = array('jpg', 'jpeg', 'gif', 'png');
        // 判断文件类型是否被允许上传
        _toCompare(!in_array($str_img_type, $arr_allow_type), '===', true, 12085);

        // 判断是否是通过HTTP POST上传的 必须是通过HTTP POST上传的
        _toCompare(!is_uploaded_file($arr_file['tmp_name']), '===', true, 12086);

        // 新的图片名称
        $str_new_name = date('YmdHis') . rand(100000, 999999);

        $object = config('oss.oss_object') . $str_type . '/' . $str_new_name . '.' . $str_img_type;

        try {
            $ossClient = new OssClient(config('oss.oss_access_key_id'), config('oss.oss_access_key_secret'), config('oss.oss_endpoint'));
            $ossClient->uploadFile(config('oss.oss_bucket'), $object, $arr_file['tmp_name']);
        } catch (OssException $e) {
            _returnError(12087);
        }

        $str_img_url = 'https://' . config('oss.oss_bucket') . '.' . config('oss.oss_endpoint') . '/' . $object;

        _returnData(['imgUrl' => $str_img_url]);
    }

    /**
     * 上传图片(base64) \n
     */
    public function uploadImgBase64($str_type)
    {
        _toCompare(in_array($str_type, $this->arr_type), '===', false, 10818); // 图片分类不正确

        $base_img = (string)Request::instance()->param('file_data', '');

        _toCompare($base_img, '===', '', 13018);

        $arr_gs = [
            'data:image/jpeg;base64,',
            'data:image/jpg;base64,',
            'data:image/png;base64,',
            'data:image/gif;base64,',
        ];

        $base64 = '';
        $str_img_type = '';

        foreach ($arr_gs as $value) {
            $ls_base64 = str_replace($value, "", $base_img, $count);
            if ($count > 0) {
                $base64 = $ls_base64;
                $str_img_type = trim(trim($value, 'data:image/'), ';base64,');
                break;
            }
            unset($ls_base64, $count);
        }

        _toCompare($str_img_type, '===', '', 13018);
        _toCompare($base64, '===', '', 13018);

        $base64 = str_replace($arr_gs, "", $base_img);
        $img = base64_decode($base64);

        // 新的图片名称
        $str_new_name = date('YmdHis') . rand(100000, 999999) . '.' . $str_img_type;

        $object = config('oss.oss_object') . $str_type . DS . $str_new_name;

        try {
            $ossClient = new OssClient(config('oss.oss_access_key_id'), config('oss.oss_access_key_secret'), config('oss.oss_endpoint'));  //
            $ossClient->putObject(config('oss.oss_bucket'), $object, $img);
        } catch (OssException $e) {
            _returnError(12087);
        }

        $str_img_url = 'http://' . config('oss.oss_bucket') . '.' . config('oss.oss_endpoint') . '/' . $object;

        _returnData(['imgUrl' => $str_img_url]);
    }

    /**
     * 图片缩放
     * @param $imgPath string 图片路径
     * @param string $thumbType string 图片缩放类型
     * @param string $type string 图片缩放类型（- lfit：等比缩放，限制在设定在指定w与h的矩形内的最大图片。- mfit：等比缩放，延伸出指定w与h的矩形框外的最小图片。- fill：固定宽高，将延伸出指定w与h的矩形框外的最小图片进行居中裁剪。- pad：固定宽高，缩略填充。- fixed：固定宽高，强制缩略）
     * @param string $height string 指定目标缩略图的高度（1-4096）
     * @param string $width string 指定目标缩略图的宽度 （1-4096）
     * @param string $limit string 指定当目标缩略图大于原图时是否处理。值是 1 表示不处理；值是 0 表示处理。
     * @param string $color string 缩放模式选择为pad（缩略填充）时，可以选择填充的颜色(默认是白色)参数的填写方式：采用16进制颜色码表示，如00FF00（绿色）
     * @return mixed
     */
    public function thumbImg($imgPath, $type = 'lfit', $height = 100, $width = 100, $color = 'FFFFFF')
    {
        $imgNewPath = $imgPath;
        switch ($type) {
            case 'lfit' : //lfit：等比缩放，限制在设定在指定w与h的矩形内的最大图片。
                $imgNewPath .= '?x-oss-process=image/resize,m_lfit,h_' . $height . ',w_' . $width;
                break;
            case 'mfit' : //mfit：等比缩放，延伸出指定w与h的矩形框外的最小图片。
                $imgNewPath .= '?x-oss-process=image/resize,m_mfit,h_' . $height . ',w_' . $width;
                break;
            case 'fill' : //fill：固定宽高，将延伸出指定w与h的矩形框外的最小图片进行居中裁剪
                $imgNewPath .= '?x-oss-process=image/resize,m_fill,h_' . $height . ',w_' . $width;
                break;
            case 'pad' : //pad：固定宽高，缩略填充。
                $imgNewPath .= '?x-oss-process=image/resize,m_pad,h_' . $height . ',w_' . $width . ',color_' . $color;
                break;
            case 'fixed' : //fixed：固定宽高，强制缩略）
                $imgNewPath .= '?x-oss-process=image/resize,m_fixed,h_' . $height . ',w_' . $width;
                break;
            default :
                break;
        }
        return $imgNewPath;
    }

    /**
     * 图片裁剪
     * @param $imgPath string 图片地址
     * @param $type string 背景色（png:透明背景，白色背景）
     * @param int $r int 半径
     * @return string
     */
    public function cutImg($imgPath, $type = 'png', $r = 100)
    {
        if ($type == 'png') {
            return $imgPath . '?x-oss-process=image/circle,r_' . $r . '/format,png';
        }
        return $imgPath . '?x-oss-process=image/circle,r_' . $r;
    }
}